﻿//c++是一种静态语言,想要靠原生实现反射是很难的
//WO套件使用了取巧的办法,即第一次运行的时候保存注册的结构体信息
//需要反射的时候根据字段与保存的成员偏移来确定需要写入的地址
//这种方法虽然没有编译期反射效率高,但是经过优化之后的模型无需担忧效率问题
//需要注意的是虽然不少类型已经内置注册了,但是还有不少类型是未注册的,已注册的包含:
//	所有数值类型[int/long/longlong/double/...]
//	逻辑型c[bool](逻辑型[BOOL]的底层是int,win平台特有的类型,本套件支持跨平台,所以会缩减部分影响可移植性的类型)
//	单文本型[CXTextA]
//	原生字符串[std::string]
//其他类型需要自行注册

//以注册文本型[CXText]为例

//定义一个回调函数,数据原型传入的时候该如何填充
函数 逻辑型c 反射回调_文本型(空类型* 待填充地址, 常量 单字符型* 用于填充的原始数据)
	//待填充地址是被填充的地址指针
	//这里将指针还原 空类型* => 文本型*
	//然后解引用 *(文本型 *)
	//然后将数据原型从单字节文本转为双字节文本后赋值
	*((文本型 *)待填充地址) = A2W_(用于填充的原始数据)
	返回 TRUE

函数 注册自定义基础类型()
	//注册文本型[CXText],并且定义其实现方法
	Wo数据反射_注册基础类型(文本型,反射回调_文本型)

结构体 验证码
	整型 id
	单文本型 value

结构体 用户登录数据
	单文本型 用户名
	文本型 密码
	验证码 capt




函数 注册反射模型()
	//嵌套结构体需要先注册子结构体

	//先注册父结构体
	Wo反射模型句柄 handle = Wo数据反射_注册结构体(验证码)
	//然后每个成员分别注册
	Wo数据反射_结构体注册成员(handle, U"id", 验证码::id, 取成员地址偏移(验证码::id))
	Wo数据反射_结构体注册成员(handle,U"value",验证码::value,取成员地址偏移(验证码::value))

	handle = Wo数据反射_注册结构体(用户登录数据)
	Wo数据反射_结构体注册成员(handle,U"username",用户登录数据::用户名,取成员地址偏移(用户登录数据::用户名))
	Wo数据反射_结构体注册成员(handle, U"密码", 用户登录数据::密码, 取成员地址偏移(用户登录数据::密码))
	//子成员结构体在上方已经注册过,所以可以直接绑定,bind会自动解析
	Wo数据反射_结构体注册成员(handle, U"capt", 用户登录数据::capt, 取成员地址偏移(用户登录数据::capt))

	


函数 login (Wo上下文& context)
	调试输出(A"-----PostForm-------")
	//只支持urlencode
	//且不支持嵌套
	调试输出(A"username:", context.取PostForm(A"username"))
	调试输出(A"密码:", context.取PostForm(A"密码"))
	调试输出(A"-----反射-------")
	//支持urlencode/json
	//json支持嵌套
	用户登录数据 传入数据
	context.取Post数据_自动反射(传入数据)
	调试输出(A"[username]username:", 传入数据.用户名)
	调试输出("[密码]密码:",传入数据.密码)
	调试输出(A"[capt.id]验证码:", 传入数据.capt.id)
	调试输出(A"[capt.value]验证码:", 传入数据.capt.value)
	

函数 整型 入口函数()
	Web_初始化环境()
	注册自定义基础类型()
	注册反射模型()
	Wo服务器类 server = Wo取全局服务器()
	server.POST(A"/login",login)
	server.绑定(A"0.0.0.0", 8090)
	server.启动()
	Web_清理环境()
	返回 0



